#include "lvgl/lvgl.h"
#include "lvgl/demos/lv_demos.h"
#include "lv_drivers/display/fbdev.h"
#include "lv_drivers/indev/evdev.h"
#include <unistd.h>
#include <pthread.h>
#include <time.h>
#include <sys/time.h>

#include <stdio.h>

#define DISP_BUF_SIZE (480 * 1024)

// 回调函数
// static void event_handler(lv_event_t * e)
// {
//     lv_event_code_t code = lv_event_get_code(e);

//     if(code == LV_EVENT_CLICKED) {
//         LV_LOG_USER("Clicked");
//     } else if(code == LV_EVENT_VALUE_CHANGED) {
//         LV_LOG_USER("Toggled");
//     }
// }

// void lv_bling_btn_1(void)
// {
//     lv_obj_t * label;

//     lv_obj_t * btn1 = lv_btn_create(lv_scr_act());
//     lv_obj_add_event_cb(btn1, event_handler, LV_EVENT_ALL, NULL);
//     lv_obj_align(btn1, LV_ALIGN_CENTER, 0, -40);

//     label = lv_label_create(btn1);
//     lv_label_set_text(label, "Button");
//     lv_obj_center(label);

//     lv_obj_t * btn2 = lv_btn_create(lv_scr_act());
//     lv_obj_add_event_cb(btn2, event_handler, LV_EVENT_ALL, NULL);
//     lv_obj_align(btn2, LV_ALIGN_CENTER, 0, 40);
//     lv_obj_add_flag(btn2, LV_OBJ_FLAG_CHECKABLE);
//     lv_obj_set_height(btn2, LV_SIZE_CONTENT);

//     label = lv_label_create(btn2);
//     lv_label_set_text(label, "Toggle");
//     lv_obj_center(label);
// }

// // 按键1回调函数
// static void event_handler1(lv_event_t * e)
// {
//     lv_event_code_t code = lv_event_get_code(e);

//     if(code == LV_EVENT_CLICKED)
//         // LV_LOG_USER("Clicked");
//         printf("anjian1\n");
// }
// // 按键2回调函数
// static void event_handler2(lv_event_t * e)
// {
//     lv_event_code_t code = lv_event_get_code(e);

//     if(code == LV_EVENT_CLICKED)
//         // LV_LOG_USER("Clicked");
//         printf("anjian2\n");
// }
// // 按键3回调函数
// static void event_handler3(lv_event_t * e)
// {
//     lv_event_code_t code = lv_event_get_code(e);

//     if(code == LV_EVENT_CLICKED)
//         // LV_LOG_USER("Clicked");
//         printf("anjian3\n");
// }
// // 按键4回调函数
// static void event_handler4(lv_event_t * e)
// {
//     lv_event_code_t code = lv_event_get_code(e);

//     if(code == LV_EVENT_CLICKED)
//         // LV_LOG_USER("Clicked");
//         printf("anjian4\n");
// }

// // 作业1:4个按键的demo
// void lv_zuoye1_btn_1(void)
// {
//     lv_obj_t * label;

//     /*btn1的按键*/
//     // 创建一个按键的对象
//     lv_obj_t * btn1 = lv_btn_create(lv_scr_act());
//     // 添加一个按键的时间
//     lv_obj_add_event_cb(btn1, event_handler1, LV_EVENT_ALL, NULL);
//     // 添加按键的位置(可以自定义按照代码里面的宏LV_ALIGN_CENTER)
//     lv_obj_align(btn1, LV_ALIGN_CENTER, -40, -40); // 左上

//     // 创建一个label标签的对象(这个label是依附在btn1上面的label)
//     label = lv_label_create(btn1);
//     // 设置label的文本信息(暂时先用英文)
//     lv_label_set_text(label, "anjian1");
//     // 设置文本的位置
//     lv_obj_center(label);

//     /*btn2的按键*/
//     lv_obj_t * btn2 = lv_btn_create(lv_scr_act());
//     lv_obj_add_event_cb(btn2, event_handler2, LV_EVENT_ALL, NULL);
//     lv_obj_align(btn2, LV_ALIGN_CENTER, -40, 40); // 左下
//     // lv_obj_add_flag(btn2, LV_OBJ_FLAG_CHECKABLE);
//     // lv_obj_set_height(btn2, LV_SIZE_CONTENT);

//     label = lv_label_create(btn2);
//     lv_label_set_text(label, "anjian2");
//     lv_obj_center(label);

//     /*btn3的按键*/
//     lv_obj_t * btn3 = lv_btn_create(lv_scr_act());
//     lv_obj_add_event_cb(btn3, event_handler3, LV_EVENT_ALL, NULL);
//     lv_obj_align(btn3, LV_ALIGN_CENTER, 40, -40); // 右上

//     label = lv_label_create(btn3);
//     lv_label_set_text(label, "anjian3");
//     lv_obj_center(label);

//     /*btn4的按键*/
//     lv_obj_t * btn4 = lv_btn_create(lv_scr_act());
//     lv_obj_add_event_cb(btn4, event_handler4, LV_EVENT_ALL, NULL);
//     lv_obj_align(btn4, LV_ALIGN_CENTER, 40, 40); // 右下

//     label = lv_label_create(btn4);
//     lv_label_set_text(label, "anjian3");
//     lv_obj_center(label);
// }

// void lv_bling_label_3(void)
// {
//     lv_obj_t * label = lv_label_create(lv_scr_act());
//     //设置标签的模式为滚动的模式
//     lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR);     /*Circular scroll*/
//     lv_obj_set_width(label, 800);
//     lv_label_set_recolor(label, true); 
//     //注意：字体显示的内容要超过你自定义的区域大小
//     lv_label_set_text(label,"#0000ff It is a circularly scrolling text.dsakjdhaskjdhkjashdkahdakjshdkasjdhjkshdkj#"); //设置文本颜色的格式   
//     lv_obj_set_style_text_font(label, &lv_font_montserrat_40, 0); 
//     // lv_label_set_text(label, "It is a circularly scrolling text. ");
//     lv_obj_align(label, LV_ALIGN_TOP_LEFT, 0, 240);
// }

// void lv_bling_image_1(void)
// {    
//     #if 1
//     /*
//         如何实现jpg图片
//         显示jpg在坐标(0,0)的位置放了一张200_200.jpg图
//     */
//     //实例化一个img的对象
//     lv_obj_t * img1 = lv_img_create(lv_scr_act());
//     //将图片放在lcd(0,0)的坐标位置
//     lv_obj_set_pos(img1,0,0);
//     //设置图片的路劲(注意图片的路径要和开发板里面的路径一致)
//     lv_img_set_src(img1,  "S:/IOT/wby/200.jpg");
//     printf("show jpg200\n");
//     #endif
// }

/*
    gif动态图的demo
*/
void lv_bling_gif_1(void)
{
    /*
        如何实现gif动态图的控件
    */
    //显示gif在坐标(200,0)的位置放了一张gif图
    //实例化一个gif的对象
    lv_obj_t *gif1 = lv_gif_create(lv_scr_act());
    //设置gif图的坐标位置
    lv_obj_set_pos(gif1,512,300);
    //lv_obj_align(gif1, LV_ALIGN_RIGHT_MID, -20, 0); //在起始坐标的位置左移20
    //设置gif图的路径
    lv_gif_set_src(gif1,"S:/IOT/wby/1.gif");
    printf("show gif\n");
}

static void event_cb(lv_event_t * e)
{
    lv_obj_t * obj = lv_event_get_current_target(e);
    LV_LOG_USER("Button %s clicked", lv_msgbox_get_active_btn_text(obj));
    
    //如果是lv_msgbox_get_active_btn_text(obj) == "apply" 表示确定
    //如果是lv_msgbox_get_active_btn_text(obj) == "close" 表示不确定
    //用strcmp函数
    const char *rst_str = lv_msgbox_get_active_btn_text(obj);
    if(strcmp(obj,"Apply") == 0)
    {
        lv_bling_gif_1();
    }    
    if(strcmp(obj,"Close") == 0)
        printf("取消按键\n");
}

void lv_example_msgbox_1(void)
{
    static const char * btns[] ={"Apply", "Close", ""};
    /*
        "Hello"是title标签
        "This is a message box with two buttons."是文本信息  
    */
    lv_obj_t * mbox1 = lv_msgbox_create(NULL, "Hello", "This is a message box with two buttons.", btns, true);
    lv_obj_add_event_cb(mbox1, event_cb, LV_EVENT_VALUE_CHANGED, NULL);
    lv_obj_center(mbox1);
}

int main(void)
{
    /*lvgl初始化*/
    lv_init();

    /*输出设备初始化及注册*/
    fbdev_init();
    /*A small buffer for LittlevGL to draw the screen's content*/
    static lv_color_t buf[DISP_BUF_SIZE];
    /*Initialize a descriptor for the buffer*/
    static lv_disp_draw_buf_t disp_buf;
    lv_disp_draw_buf_init(&disp_buf, buf, NULL, DISP_BUF_SIZE);
    /*Initialize and register a display driver*/
    static lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.draw_buf = &disp_buf;
    disp_drv.flush_cb = fbdev_flush;
    disp_drv.hor_res  = 800;
    disp_drv.ver_res  = 480;
    lv_disp_drv_register(&disp_drv);

    // 输入设备初始化及注册
    evdev_init();
    static lv_indev_drv_t indev_drv_1;
    lv_indev_drv_init(&indev_drv_1); /*Basic initialization*/
    indev_drv_1.type = LV_INDEV_TYPE_POINTER;
    /*This function will be called periodically (by the library) to get the mouse position and state*/
    indev_drv_1.read_cb = evdev_read;
    lv_indev_drv_register(&indev_drv_1);
    // lv_indev_t * mouse_indev = lv_indev_drv_register(&indev_drv_1);

    // 官方demo---可以换为自己的demo
    //  lv_demo_widgets();

    // lv_bling_btn_1();
    //lv_zuoye1_btn_1(); // 作业1:4个按键
    //lv_bling_label_3();
    //lv_bling_image_1();
    //lv_bling_gif_1();
    //lv_example_msgbox_1();
    

    /*事物处理及告知lvgl节拍数*/
    while(1) {
        lv_timer_handler(); // 事务处理
        lv_tick_inc(5);     // 节拍累计
        usleep(5000);
    }

    return 0;
}

/*用户节拍获取*/
uint32_t custom_tick_get(void)
{
    static uint64_t start_ms = 0;
    if(start_ms == 0) {
        struct timeval tv_start;
        gettimeofday(&tv_start, NULL);
        start_ms = (tv_start.tv_sec * 1000000 + tv_start.tv_usec) / 1000;
    }

    struct timeval tv_now;
    gettimeofday(&tv_now, NULL);
    uint64_t now_ms;
    now_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000;

    uint32_t time_ms = now_ms - start_ms;
    return time_ms;
}
